Cpupools: vcpu affinity handling
authorJuergen Gross <juergen.gross@ts.fujitsu.com>
Thu, 10 Feb 2011 09:02:50 +0000 (09:02 +0000)
committerJuergen Gross <juergen.gross@ts.fujitsu.com>
Thu, 10 Feb 2011 09:02:50 +0000 (09:02 +0000)
If a vcpu is pinned to multiple physical cpus, the pinning is not
removed if all those physical cpus are removed from the cpupool. When
disabling the scheduler on a cpu, the affinity mask must be checked
against the cpumask of the cpupool.

Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
xen/common/schedule.c

index 21509b6df193d50db2aca2432bd2c4629cf22e83..5f192d272ca5a203a631c2ece64c90c24b459b6e 100644 (file)
@@ -466,6 +466,7 @@ int cpu_disable_scheduler(unsigned int cpu)
     struct domain *d;
     struct vcpu *v;
     struct cpupool *c;
+    cpumask_t online_affinity;
     int    ret = 0;
     bool_t affinity_broken;
 
@@ -484,7 +485,8 @@ int cpu_disable_scheduler(unsigned int cpu)
         {
             vcpu_schedule_lock_irq(v);
 
-            if ( (cpus_weight(v->cpu_affinity) == 1) &&
+            cpus_and(online_affinity, v->cpu_affinity, c->cpu_valid);
+            if ( cpus_empty(online_affinity) &&
                  cpu_isset(cpu, v->cpu_affinity) )
             {
                 printk("Breaking vcpu affinity for domain %d vcpu %d\n",